{"componentChunkName":"component---src-templates-blog-page-index-tsx","path":"/call-fallback-delegatecall/","result":{"data":{"mdx":{"body":"var _excluded = [\"components\"];\n\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\n\nfunction _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }\n\nfunction _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }\n\n/* @jsxRuntime classic */\n\n/* @jsx mdx */\nvar _frontmatter = {\n  \"layout\": \"BlogPage\",\n  \"title\": \"Call, Fallback, Delegatecall e chamadas de contratos\",\n  \"description\": \"Nesse artigo iremos abordar sobre a utilização das funções `call`, `fallback`, `delegatecall` e chamadas de outros contratos no seu contrato inteligente. Falaremos sobre `call`, `fallback` e `delegatecall`.\",\n  \"image\": \"capa.jpg\",\n  \"tags\": [\"Intermediário\"],\n  \"author\": [\"Matheus\"],\n  \"publishedAt\": \"22/05/2022\",\n  \"modifiedAt\": \"20220522\",\n  \"suburl\": \"call-fallback-delegatecall/\"\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n      props = _objectWithoutProperties(_ref, _excluded);\n\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"p\", null, \"Nesse artigo iremos abordar sobre a utiliza\\xE7\\xE3o das fun\\xE7\\xF5es \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"call\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"fallback\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"delegatecall\"), \" e chamadas de outros contratos no seu contrato inteligente.\\nFalaremos sobre \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"call\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"fallback\"), \" e \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"delegatecall\"), \".\"), mdx(\"h2\", {\n    \"id\": \"call-chamar\"\n  }, \"Call (Chamar)\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"call\"), \" \\xE9 uma fun\\xE7\\xE3o de baixo n\\xEDvel para interagir com outros contratos.\"), mdx(\"p\", null, \"Este \\xE9 o m\\xE9todo recomendado para usar quando voc\\xEA est\\xE1 apenas enviando Ether por meio da chamada da fun\\xE7\\xE3o \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"fallback\"), \".\"), mdx(\"p\", null, \"No entanto, n\\xE3o \\xE9 a maneira recomendada de chamar fun\\xE7\\xF5es existentes.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\n// Defini\\xE7\\xE3o do contrato Receiver ou Recebedor\\ncontract Receiver {\\n    event Received(address caller, uint amount, string message);\\n\\n    fallback() external payable {\\n        emit Received(msg.sender, msg.value, \\\"Fallback foi chamado\\\");\\n    }\\n\\n    function foo(string memory _message, uint _x) public payable returns (uint) {\\n        emit Received(msg.sender, msg.value, _message);\\n\\n        return _x + 1;\\n    }\\n}\\n\\n// Defini\\xE7\\xE3o do contrato Caller ou Chamador\\ncontract Caller {\\n    event Response(bool success, bytes data);\\n\\n    // Vamos imaginar que o contrato B n\\xE3o tenha o c\\xF3digo fonte para\\n    // contrato A, mas sabemos o endere\\xE7o de A e a fun\\xE7\\xE3o a ser chamada.\\n    function testCallFoo(address payable _addr) public payable {\\n        // Voc\\xEA pode enviar \\xE9ter e especificar uma quantidade de g\\xE1s personalizada\\n        (bool success, bytes memory data) = _addr.call{value: msg.value, gas: 5000}(\\n            abi.encodeWithSignature(\\\"foo(string,uint256)\\\", \\\"call foo\\\", 123)\\n        );\\n\\n        emit Response(success, data);\\n    }\\n\\n    // Chamar uma fun\\xE7\\xE3o que n\\xE3o existe aciona a fun\\xE7\\xE3o de fallback.\\n    function testCallDoesNotExist(address _addr) public {\\n        (bool success, bytes memory data) = _addr.call(\\n            abi.encodeWithSignature(\\\"doesNotExist()\\\")\\n        );\\n\\n        emit Response(success, data);\\n    }\\n}\\n\")), mdx(\"br\", null), mdx(\"h2\", {\n    \"id\": \"fallback-retorno\"\n  }, \"Fallback (Retorno)\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"fallback\"), \" \\xE9 uma fun\\xE7\\xE3o que n\\xE3o recebe nenhum argumento e n\\xE3o retorna nada.\"), mdx(\"p\", null, \"\\xC9 executada Quando\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"uma fun\\xE7\\xE3o que n\\xE3o existe \\xE9 chamada\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, \"o Ether enviado diretamente para um contrato, mas \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"receive()\"), \" n\\xE3o existe ou \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"msg.data\"), \" n\\xE3o est\\xE1 vazio\")), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"fallback\"), \" tem um limite de gas de 2300 quando chamado por \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"transfer\"), \" ou \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"send\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\ncontract Fallback {\\n    event Log(uint gas);\\n\\n    // A fun\\xE7\\xE3o de fallback deve ser declarada como externa.\\n    fallback() external payable {\\n        // send / transfer (envia 2300 gas para esta fun\\xE7\\xE3o fallback)\\n        // call (envia todo gas)\\n        emit Log(gasleft());\\n    }\\n\\n    // Fun\\xE7\\xE3o auxiliar para verificar o saldo deste contrato\\n    function getBalance() public view returns (uint) {\\n        return address(this).balance;\\n    }\\n}\\n\\ncontract SendToFallback {\\n    function transferToFallback(address payable _to) public payable {\\n        _to.transfer(msg.value);\\n    }\\n\\n    function callFallback(address payable _to) public payable {\\n        (bool sent, ) = _to.call{value: msg.value}(\\\"\\\");\\n        require(sent, \\\"Falha ao enviar Ether\\\");\\n    }\\n}\\n\")), mdx(\"br\", null), mdx(\"h2\", {\n    \"id\": \"delegatecall\"\n  }, \"Delegatecall\"), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"delegatecall\"), \" \\xE9 uma fun\\xE7\\xE3o de baixo n\\xEDvel semelhante a \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"call\"), \".\"), mdx(\"p\", null, \"Quando o contrato \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"A\"), \" \\xE9 executado \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"delegatecall\"), \" para o contrato \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"B\"), \", o c\\xF3digo de \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"B\"), \" \\xE9 executado com o armazenamento do contrato \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"A\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"msg.sender\"), \" e \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"msg.value\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\n// NOTA: Implemente este contrato primeiro\\ncontract B {\\n    // NOTA: layout de armazenamento deve ser o mesmo do contrato A\\n    uint public num;\\n    address public sender;\\n    uint public value;\\n\\n    function setVars(uint _num) public payable {\\n        num = _num;\\n        sender = msg.sender;\\n        value = msg.value;\\n    }\\n}\\n\\ncontract A {\\n    uint public num;\\n    address public sender;\\n    uint public value;\\n\\n    function setVars(address _contract, uint _num) public payable {\\n        // O armazenamento de A est\\xE1 definido, B n\\xE3o \\xE9 modificado.\\n        (bool success, bytes memory data) = _contract.delegatecall(\\n            abi.encodeWithSignature(\\\"setVars(uint256)\\\", _num)\\n        );\\n    }\\n}\\n\")), mdx(\"br\", null), mdx(\"h2\", {\n    \"id\": \"seletor-de-função\"\n  }, \"Seletor de Fun\\xE7\\xE3o\"), mdx(\"p\", null, \"Quando uma fun\\xE7\\xE3o \\xE9 chamada, os primeiros 4 bytes \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"calldata\"), \" especificam qual fun\\xE7\\xE3o chamar.\"), mdx(\"p\", null, \"Esses 4 bytes s\\xE3o chamados de seletor de fun\\xE7\\xE3o.\"), mdx(\"p\", null, \"Por exemplo, este c\\xF3digo abaixo. Ele usa \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"call\"), \" para executar \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"transfer\"), \" um contrato no endere\\xE7o \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"addr\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"addr.call(abi.encodeWithSignature(\\\"transfer(address,uint256)\\\", 0xSomeAddress, 123))\\n\")), mdx(\"p\", null, \"Os primeiros 4 bytes retornados \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"abi.encodeWithSignature(....)\"), \" s\\xE3o o seletor de fun\\xE7\\xE3o.\"), mdx(\"p\", null, \"Posso economizar uma pequena quantidade de gas se pr\\xE9-computar e inserir o seletor de fun\\xE7\\xE3o em seu c\\xF3digo?\"), mdx(\"p\", null, \"Aqui est\\xE1 como o seletor de fun\\xE7\\xE3o \\xE9 calculado.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\ncontract FunctionSelector {\\n    /*\\n    \\\"transfer(address,uint256)\\\"\\n    0xa9059cbb\\n    \\\"transferFrom(address,address,uint256)\\\"\\n    0x23b872dd\\n    */\\n    function getSelector(string calldata _func) external pure returns (bytes4) {\\n        return bytes4(keccak256(bytes(_func)));\\n    }\\n}\\n\")), mdx(\"br\", null), mdx(\"h2\", {\n    \"id\": \"chamando-outro-contrato\"\n  }, \"Chamando outro contrato\"), mdx(\"p\", null, \"Um contrato pode chamar outros contratos de 2 maneiras.\"), mdx(\"p\", null, \"A maneira mais f\\xE1cil \\xE9 apenas cham\\xE1-lo da seguinte maneira: \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"A.foo(x, y, z)\"), \".\"), mdx(\"p\", null, \"Outra maneira de chamar outros contratos \\xE9 usar o \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"call\"), \". Este m\\xE9todo n\\xE3o \\xE9 o mais recomendado.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\n// Contrato a ser chamado\\ncontract Callee {\\n    uint public x;\\n    uint public value;\\n\\n    function setX(uint _x) public returns (uint) {\\n        x = _x;\\n        return x;\\n    }\\n\\n    function setXandSendEther(uint _x) public payable returns (uint, uint) {\\n        x = _x;\\n        value = msg.value;\\n\\n        return (x, value);\\n    }\\n}\\n\\n// Contrato que realizar\\xE1 as chamadas\\ncontract Caller {\\n    // Dessa forma passamos o contrato Callee por par\\xE2metro\\n    // atrav\\xE9s do _callee conseguimos acessar todas as fun\\xE7\\xF5es\\n    // p\\xFAblicas do contrato Callee\\n    function setX(Callee _callee, uint _x) public {\\n        uint x = _callee.setX(_x);\\n    }\\n\\n    function setXFromAddress(address _addr, uint _x) public {\\n        // Dessa forma, definimos o contrato Callee dentro\\n        // da fun\\xE7\\xE3o, passando o endere\\xE7o por par\\xE2metro no\\n        // contrato Callee e ent\\xE3o podemos chamar suas fun\\xE7\\xF5es\\n        Callee callee = Callee(_addr);\\n        callee.setX(_x);\\n    }\\n\\n    function setXandSendEther(Callee _callee, uint _x) public payable {\\n        (uint x, uint value) = _callee.setXandSendEther{value: msg.value}(_x);\\n    }\\n}\\n\")), mdx(\"br\", null), mdx(\"h3\", {\n    \"id\": \"testar-no-remix\"\n  }, \"Testar no \", mdx(\"a\", {\n    parentName: \"h3\",\n    \"href\": \"https://remix.ethereum.org/\",\n    \"target\": \"_blank\",\n    \"rel\": \"noopener\"\n  }, \"Remix\")), mdx(\"br\", null), mdx(\"br\", null));\n}\n;\nMDXContent.isMDXComponent = true;","frontmatter":{"title":"Call, Fallback, Delegatecall e chamadas de contratos","description":"Nesse artigo iremos abordar sobre a utilização das funções `call`, `fallback`, `delegatecall` e chamadas de outros contratos no seu contrato inteligente. Falaremos sobre `call`, `fallback` e `delegatecall`.","image":{"childImageSharp":{"fluid":{"base64":"data:image/jpeg;base64,/9j/2wBDABALDA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxOQERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVGC8aGi9jQjhCY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2P/wgARCAANABQDASIAAhEBAxEB/8QAFwAAAwEAAAAAAAAAAAAAAAAAAAIEAf/EABQBAQAAAAAAAAAAAAAAAAAAAAD/2gAMAwEAAhADEAAAAbKHYY0P/8QAGhAAAgMBAQAAAAAAAAAAAAAAAQIAERIEIf/aAAgBAQABBQJTXQ+1VbyRTewT/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPwE//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPwE//8QAHBAAAgICAwAAAAAAAAAAAAAAAREAAjFRAxAh/9oACAEBAAY/AiDyE2s0NQkOx1A8x+Pamev/xAAbEAADAQADAQAAAAAAAAAAAAAAAREhMUFx0f/aAAgBAQABPyGjIQ8INCV0yjMxZGoTCq+hZ+Cprp//2gAMAwEAAgADAAAAEODP/8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAwEBPxA//8QAFBEBAAAAAAAAAAAAAAAAAAAAEP/aAAgBAgEBPxA//8QAHRABAQACAQUAAAAAAAAAAAAAAREAIYExQVFh0f/aAAgBAQABPxAbPgac0J2fnvGjBpNckxiDBSUeNY2P1MKPFxkgHGi0O+kz/9k=","aspectRatio":1.5151515151515151,"src":"/static/f1bb916edf32bdc1f9fdbfd9aac26ffe/0cb3d/capa.jpg","srcSet":"/static/f1bb916edf32bdc1f9fdbfd9aac26ffe/f836f/capa.jpg 200w,\n/static/f1bb916edf32bdc1f9fdbfd9aac26ffe/2244e/capa.jpg 400w,\n/static/f1bb916edf32bdc1f9fdbfd9aac26ffe/0cb3d/capa.jpg 536w","sizes":"(max-width: 536px) 100vw, 536px"}}},"tags":["Intermediário"],"author":["Matheus"],"suburl":"call-fallback-delegatecall/","publishedAt":"22/05/2022","modifiedAt":"20220522"},"tableOfContents":{"items":[{"url":"#call-chamar","title":"Call (Chamar)"},{"url":"#fallback-retorno","title":"Fallback (Retorno)"},{"url":"#delegatecall","title":"Delegatecall"},{"url":"#seletor-de-função","title":"Seletor de Função"},{"url":"#chamando-outro-contrato","title":"Chamando outro contrato","items":[{"url":"#testar-no-remix","title":"Testar no Remix"}]}]},"timeToRead":1},"allMdx":{"nodes":[{"frontmatter":{"suburl":"sistema-de-swap-estavel-amm/","title":"Como criar um sistema de Swap estável AMM","tags":["Avançado","DeFi"]}},{"frontmatter":{"suburl":"produto-constante-amm/","title":"Como criar um produto constante AMM","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"soma-constante-amm/","title":"Como criar uma soma constante AMM","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-cofre/","title":"Como criar um sistema de Cofre","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-staking/","title":"Como criar um sistema de Staking de Recompensas","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"sistema-de-preco-chainlink-oracle/","title":"Como criar um sistema de preços Oracle","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"exemplos-de-uso-do-uniswap-v3/","title":"Exemplos de uso do Uniswap V3","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"fornecimento-unilateral-com-uniswap-v2/","title":"Fornecimento unilateral ideal com Uniswap V2","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"adicionar-e-remover-liquidez-com-uniswap-v2/","title":"Como adicionar e remover liquidez com Uniswap V2","tags":["Intermediário","Avançado","DeFi"]}},{"frontmatter":{"suburl":"swap-com-uniswap-v2/","title":"Como realizar Swap com Uniswap V2","tags":["Intermediário","DeFi"]}},{"frontmatter":{"suburl":"testes-com-echidna/","title":"Como realizar testes com Echidna","tags":["Intermediário"]}},{"frontmatter":{"suburl":"ignorar-verificacao-do-tamanho-do-contrato/","title":"Como ignorar a verificação do tamanho do contrato","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"repeticao-de-assinatura/","title":"Repetição de assinatura","tags":["Avançado","Hacks"]}},{"frontmatter":{"suburl":"manipular-timestamp-do-bloco/","title":"Manipulando o timestamp do bloco na blockchain","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ataque-front-running/","title":"Ataque utilizando a técnica front running","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"honeypot/","title":"Criar uma armadilha para hackers com a técnica honeypot","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ocultar-script-malicioso/","title":"Como um contrato malicioso esconde seu script","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"phishing-com-txorigin/","title":"Phishing com tx.origin","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"negacao-de-servico/","title":"Inutilizar um contrato através da negação de serviço","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"fonte-de-aleatoriedade/","title":"Fonte de Aleatoriedade","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"chamada-de-funcao-delegatecall/","title":"Chamada de função delegatecall","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"acessando-variaveis-privadas/","title":"Acessando variáveis privadas","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"auto-destruicao/","title":"Ataques com Auto-destruição","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"estouro-de-memoria/","title":"Ataques com estouro de memória","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"ataque-de-reentrada/","title":"Ataque de reentrada, aprenda como funciona e como evitar","tags":["Intermediário","Hacks"]}},{"frontmatter":{"suburl":"bloqueio-de-tempo-timelock/","title":"Criar um contrato com bloqueio de tempo","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"contrato-para-multichamadas/","title":"Criar contrato para Multichamada de funções","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"financiamento-coletivo-crowd-fund/","title":"Criar um sistema de financiamento coletivo","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"sistema-de-leilao-ingles-holandes/","title":"Criar um sistema de leilão inglês e holandês","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"canal-de-pagamento-bidirecional/","title":"Criar um Canal de pagamento bidirecional","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"canal-de-pagamento-unidirecional/","title":"Criar um Canal de pagamento unidirecional","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"gravar-dados-no-slot/","title":"Como gravar dados em qualquer slot","tags":["Intermediário","Aplicações"]}},{"frontmatter":{"suburl":"implantar-contrato-com-proxy/","title":"Como implantar qualquer contrato com Proxy","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"trabalhando-com-proxy/","title":"Trabalhando com Proxy","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"precomputar-endereco-contrato/","title":"Pré-computar endereço do Contrato com Create2","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"token-erc721/","title":"Criando nosso primeiro Token ERC721","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"token-erc20/","title":"Criando nosso primeiro Token ERC20","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-mapeamento-iteravel/","title":"Mapeamento Iterável","tags":["Intermediário","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-arvore-merkle/","title":"Árvore de Merkle","tags":["Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-multi-assinatura/","title":"Carteira com Multi-Assinaturas","tags":["Intermediário","Avançado","Aplicações"]}},{"frontmatter":{"suburl":"aplicacao-wallet/","title":"Carteira de Tokens","tags":["Iniciante","Aplicações"]}},{"frontmatter":{"suburl":"assinaturas-e-hashing-keccak/","title":"Verificando assinatura hashing com Keccak256","tags":["Intermediário","Avançado"]}},{"frontmatter":{"suburl":"abi/","title":"O que é ABI e para que serve?","tags":["Iniciante"]}},{"frontmatter":{"suburl":"import-e-libraries/","title":"Import e Libraries, para que servem?","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"criar-contrato-simples/","title":"Criar um contrato através de outro contrato","tags":["Intermediário"]}},{"frontmatter":{"suburl":"call-fallback-delegatecall/","title":"Call, Fallback, Delegatecall e chamadas de contratos","tags":["Intermediário"]}},{"frontmatter":{"suburl":"transfer-send-call/","title":"Enviar Ether com transfer, send e call","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"visibilidade-interface-pagavel/","title":"Visibilidade, Interfaces e Funções Pagáveis","tags":["Intermediário"]}},{"frontmatter":{"suburl":"evento-construtor-heranca/","title":"Evento, Construtor e Herança","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"tratamento-de-erros/","title":"Tratamento de erros de condições e exceções","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"funcoes/","title":"Funções e Modificadores","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"armazenamento/","title":"Armazenamento de Dados","tags":["Intermediário"]}},{"frontmatter":{"suburl":"estruturas/","title":"Estruturas - Struct","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"enum/","title":"Enum - Enumeradores","tags":["Iniciante","Intermediário"]}},{"frontmatter":{"suburl":"mapping-arrays/","title":"Mapping e Arrays","tags":["Iniciante"]}},{"frontmatter":{"suburl":"if-else-for-while/","title":"If, Else, For e While","tags":["Iniciante"]}},{"frontmatter":{"suburl":"ether-wei-gas/","title":"Ether, Wei e Taxa de Gas","tags":["Iniciante"]}},{"frontmatter":{"suburl":"variaveis/","title":"Entendendo as Variáveis","tags":["Iniciante"]}},{"frontmatter":{"suburl":"primeiro-aplicativo/","title":"Meu primeiro aplicativo","tags":["Iniciante","Aplicações"]}}]},"topicsYaml":{"topics":[{"desc":"Todos os conteúdos de nível iniciante estão disponíveis aqui","title":"Iniciante","url":"iniciante/"},{"desc":"Todos os conteúdos de nível intermediário estão disponíveis aqui","title":"Intermediário","url":"intermediario/"},{"desc":"Todos os conteúdos de nível avançado estão disponíveis aqui","title":"Avançado","url":"avancado/"},{"desc":"Todos os artigos referentes a exemplos de aplicações do Solidity, estão disponíveis aqui","title":"Aplicações","url":"aplicacoes/"},{"desc":"Todos os artigos referentes a exemplos de aplicação de hacks do Solidity, estão disponíveis aqui","title":"Hacks","url":"hacks/"},{"desc":"Todos os artigos referentes a exemplos de aplicação DeFi do Solidity, estão disponíveis aqui","title":"DeFi","url":"defi/"},{"desc":"Artigos de outras linguagens de programação, exemplos de interação entre a blockchain e aplicativos externos, estão disponíveis aqui","title":"Outros Artigos","url":"artigos/"}]}},"pageContext":{"suburl":"call-fallback-delegatecall/","postTopics":["Intermediário"],"publishedAt":"22/05/2022","prevArticle":{"title":"Enviar Ether com transfer, send e call","layout":"BlogPage","suburl":"transfer-send-call/","author":["Matheus"],"tags":["Iniciante","Intermediário"],"publishedAt":"21/05/2022","modifiedAt":"20220521"},"nextArticle":{"title":"Criar um contrato através de outro contrato","layout":"BlogPage","suburl":"criar-contrato-simples/","author":["Matheus"],"tags":["Intermediário"],"publishedAt":"24/05/2022","modifiedAt":"20220524"}}},"staticQueryHashes":["119291576","2330562257","4065828390"]}